<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>1_高阶函数_函数柯里化</title>
</head>
<body>
<!-- 准备好一个"容器" -->
<div id="test1"></div>

<!-- 引入React核心库 -->
<script type="text/javascript" src="../js/react.development.js"></script>
<!-- 引入react-dom，用于支持react操作DOM -->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!-- 引入babel，用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<!-- 引入prop-types，用于对组件标签属性进行限制 -->
<script type="text/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">
  /*
  * 高阶函数：如果一个函数符合下面2个规范中的任何一个，那该函数就是高阶函数
  *     1.若A函数，接收的参数是一个函数，那么A就可以称之为高阶函数
  *     2.若A函数，调用的返回值依然是一个函数，那么A就可以称之为高阶函数
  *     常见的高阶函数有：Promise、setTimeout、arr.map()等等
  * 函数柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码方式
  * */
  // 1.创建组件
  class Login extends React.Component {

    state = {
      username: '',   // 用户名
      password: ''    // 密码
    }

    // 保存表单数据到状态中
    saveFormData = dataType => {
      return (event) => {
        this.setState({[dataType]: event.target.value})
      }
    }

    // 表单提交的回调
    handleSubmit = event => {
      event.preventDefault()    // 阻止表单提交
      const {username, password} = this.state
      alert(`你输入的用户名是：${username}, 你输入的密码是：${password}`)
    }

    render() {
      return (
        <form action="http://www.atguigu.com" onSubmit={this.handleSubmit}>
          用户名：<input onChange={this.saveFormData('username')} type="text" name="username"/>
          密码：<input onChange={this.saveFormData('password')} ref={c => this.password = c} type="password" name="password"/>
          <button>登录</button>
        </form>
      )
    }
  }

  // 2.渲染组件到页面
  ReactDOM.render(<Login />, document.getElementById('test1'))
</script>
</body>
</html>
